
Screenshot: Let There Be Widgets
文件:
•. t4.rb
这个示例演示的是如何创建妳自己的部件,以及如何控制一个部件的最小和最大尺寸。
require 'Qt4'
class MyWidget < Qt::Widget
def initialize(parent = nil)
super
setFixedSize(200, 120)
quit = Qt::PushButton.new(tr('Quit'), self)
quit.setGeometry(62, 40, 75, 30)
quit.setFont(Qt::Font.new('Times', 18, Qt::Font::Bold))
connect(quit, SIGNAL('clicked()'), $qApp, SLOT('quit()'))
end
end
app = Qt::Application.new(ARGV)
widget = MyWidget.new()
widget.show()
app.exec()
class MyWidget < Qt::Widget
这里我们创建了一个新的类。因为这个类继承了Qt::Widget,所以,新产生的类是一个部件,它可以成为一个顶级窗口或者一个子代部件(这一点就跟前一章中的Qt::PushButton一样)。
def initialize(parent = nil)
super
这个类只有一个成员函数,即为它的构造函数(当然,它从Qt::Widget继承了狠多成员函数)。这里写的构造函数是一个标准的Qt部件构造函数;当妳创建自定义部件时,都应当给它写一个类似的构造函数。
参数就是它的亲代部件。要创建一个顶级窗口的话,就将亲代部件指定为空(nil)。如妳所见,这个部件默认即为一个顶级窗口。
就像大部分部件一样,它直接将parent 参数传递给Qt::Widget的构造函数。(如果妳还是Ruby的初学都,那么现在说明一下,不带任何参数地调用super,会使得将本方法接收到的任何参数自动地传递给超类的同名方法。更新 :显然,也要注意别带上括号 — 如果调用super()的话,会调用超类的同名方法,但是不传递任何参数。)
setFixedSize(200, 120)
因为这个部件不知道该如何处理尺寸的改变事件,所以我们固定住它的尺寸。在下一章中,我们会演示一个部件该如何对用户发起的尺寸改变事件作出响应。
quit = Qt::PushButton.new(tr('Quit'), self)
quit.setGeometry(62, 40, 75, 30)
quit.setFont(Qt::Font.new('Times', 18, Qt::Font::Bold))
这里,我们为这个部件创建并且设置了一个子代部件(新部件的亲代部件是self,即为当前的这个MyWidget 实例)。
包围在字符串常量'Quit'两侧的QObject::tr()函数调用会将这个字符串标记为可翻译的,这样,就可以在运行时根据一个翻译文件的内容来改变字符串的实际内容。要养成这样一个好习惯,将所有能被用户看到的字符串都带上QObject::tr(),以防妳将来想要将妳的程序翻译为别的自然语言。
Qt::Widget::setGeometry()函数会同时设置这个部件在屏幕上的位置和尺寸。它等价于先调用Qt::Widget::move()然后调用Qt::Widget::resize()。
connect(quit, SIGNAL('clicked()'), $qApp, SLOT('quit()'))
$qApp指针是一个全局变量,当妳require 'Qt'的时候就会被创建。它指向当前这个程序的唯一的Qt::Application实例。
app = Qt::Application.new(ARGV)
widget = MyWidget.new()
widget.show()
app.exec()
这里,我们实例化我们的新子代部件,将它设置为主部件,然后执行程序。
这个程序的行为与之前那个的行为非常类似。不同之处就在于我们是以一种不同的方式来实现它的。当然,它的行为还是有一点不同的。妳只需要试着改变它的大小就知道了。
试着创建另一个MyWidget 对象。结果如何?
试着添加更多的按钮,或者添加别的部件,而不仅仅是Qt::PushButton。
准备出发噢~宝贝 我想你
HxLauncher: Launch Android applications by voice commands